public class Main {
    static int[] arr = new int[10];

    public static void circle(int n) {
        if (n == 10) return;
        for (int i = 0; i < 4; i++) {
            arr[n] = i;
            if (judge()) {
                for (int j = 0; j < arr.length; j++) {
                    char a = 'A';
                    System.out.print((char) (a + arr[j]));
                }
                System.out.println();
            }
            circle(n + 1);
        }
    }

    public static boolean judge() {
        int right = 1;
        //2.第5题的答案是:
        //A.C
        //B D
        //C A
        //D B
        if (arr[1] == 0 && arr[4] == 2) {
            right++;
        } else if (arr[1] == 1 && arr[4] == 3) {
            right++;
        } else if (arr[1] == 2 && arr[4] == 0) {
            right++;
        } else if (arr[1] == 3 && arr[4] == 1) {
            right++;
        }
        //3.以下选项中哪一题的答案与其他三项不同:
        //A.第3题
        //B.第6题
        //C.第2题
        //D.第4题
        int differ = differ();
        if (arr[2] == 0 && differ == 2) {
            right++;
        } else if (arr[2] == 1 && differ == 5) {
            right++;
        } else if (arr[2] == 2 && differ == 1) {
            right++;
        } else if (arr[2] == 3 && differ == 3) {
            right++;
        }
        //4.以下选项中哪两项的答案相同:
        //A.第1、5题B.第2、7题C.第1、9题D.第6、10题
        if (arr[3] == 0 && arr[0] == arr[4]) {
            right++;
        } else if (arr[3] == 1 && arr[1] == arr[6]) {
            right++;
        } else if (arr[3] == 2 && arr[0] == arr[8]) {
            right++;
        } else if (arr[3] == 3 && arr[5] == arr[9]) {
            right++;
        }
        //5.以下选项中哪一题的答案与本题相同:
        //A.第8题B.第4题C.第9题D第7题
        if (arr[4] == 0 && arr[4] == arr[7]) {
            right++;
        } else if (arr[4] == 1 && arr[4] == arr[3]) {
            right++;
        } else if (arr[4] == 2 && arr[4] == arr[8]) {
            right++;
        } else if (arr[4] == 3 && arr[4] == arr[6]) {
            right++;
        }
        //6.以下选项中哪两题的答案与第8题相同:
        //A.第2、4题B第1、6题C第3、10题D第5、9题
        if (arr[5] == 0 && arr[7] == arr[1] && arr[7] == arr[3]) {
            right++;
        } else if (arr[5] == 1 && arr[7] == arr[0] && arr[7] == arr[5]) {
            right++;
        } else if (arr[5] == 2 && arr[7] == arr[2] && arr[7] == arr[9]) {
            right++;
        } else if (arr[5] == 3 && arr[7] == arr[4] && arr[7] == arr[8]) {
            right++;
        }
        //7.在此十道题中，被选中次数最少的选项字母为:
        //A.C
        //B B
        //C A
        //D D
        int count[][] = count();
        int minVal = count[0][0];
        int maxVal = count[0][1];
        int minIndex = count[1][0];
        if (arr[6] == 0 && minIndex == 2) {
            right++;
        } else if (arr[6] == 1 && minIndex == 1) {
            right++;
        } else if (arr[6] == 2 && minIndex == 0) {
            right++;
        } else if (arr[6] == 3 && minIndex == 3) {
            right++;
        }
        //8.以下选项中哪一题的答案与第一题的答案在字母中不相邻:
        //A.第7题
        //B.第5题
        //C.第2题
        //D.第10题
        if (arr[7] == 0 && noClose(arr[0], arr[6])) {
            right++;
        } else if (arr[7] == 1 && noClose(arr[0], arr[4])) {
            right++;
        } else if (arr[7] == 2 && noClose(arr[0], arr[1])) {
            right++;
        } else if (arr[7] == 3 && noClose(arr[0], arr[9])) {
            right++;
        }
        //9.已知“第1题与第6题的答案相同”与“第X题与第5题的答案相
        //同”的真假性相反，那么X为:
        //A.第6题
        //B.第10题
        //C.第2题
        //D.第9题
        if (arr[8] == 0 && (arr[0] == arr[6]) != (arr[5] == arr[4])) {
            right++;
        } else if (arr[8] == 1 && (arr[0] == arr[6]) != (arr[9] == arr[4])) {
            right++;
        } else if (arr[8] == 2 && (arr[0] == arr[6]) != (arr[1] == arr[4])) {
            right++;
        } else if (arr[8] == 3 && (arr[0] == arr[6]) != (arr[8] == arr[4])) {
            right++;
        }
        //10.在此10道题中，ABCD四个字母出现最多与最少者的差为:
        //A.3
        //B 2
        //C.4
        //D.1
        if (arr[9] == 0 && maxVal - minVal == 3) {
            right++;
        } else if (arr[9] == 1 && maxVal - minVal == 2) {
            right++;
        } else if (arr[9] == 2 && maxVal - minVal == 4) {
            right++;
        } else if (arr[9] == 3 && maxVal - minVal == 1) {
            right++;
        }
        if (right == 10)
            return true;
        return false;
    }

    public static int differ() {
        // 2 5 1 3
        if (arr[2] == arr[5] && arr[2] == arr[1] && arr[2] != arr[3]) return 3;
        if (arr[2] == arr[5] && arr[2] == arr[3] && arr[2] != arr[1]) return 1;
        if (arr[2] == arr[1] && arr[2] == arr[3] && arr[2] != arr[5]) return 5;
        if (arr[1] == arr[5] && arr[3] == arr[1] && arr[2] != arr[3]) return 2;
        return -1;
    }

    public static int[][] count() {
        int count[] = new int[4];
        for (int i = 0; i < arr.length; i++) {
            count[arr[i]]++;
        }
        int minVal = count[0];
        int maxVal = count[0];
        int minIndex = 0;
        int maxIndex = 0;

        // 遍历数组，找到最小值和最大值及其索引
        for (int i = 1; i < count.length; i++) {
            if (count[i] < minVal) {
                minVal = count[i];
                minIndex = i;
            } else if (count[i] > maxVal) {
                maxVal = count[i];
                maxIndex = i;
            }
        }
        int[][] ans = new int[2][2];
        ans[0][0] = minVal;
        ans[0][1] = maxVal;
        ans[1][0] = minIndex;
        ans[1][1] = maxIndex;
        return ans;
    }

    public static boolean noClose(int i, int j) {
        if (Math.abs(i - j) > 1) return true;
        return false;
    }

    public static void main(String[] args) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 0;
        }
        circle(0);
    }
}